package com.urbane.product.entity;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;

import javax.persistence.*;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Map;

/**
 * SKU 实体（Stock Keeping Unit）
 * 功能：
 *   - 代表一个具体的可售商品单元（如 iPhone 15 Pro 128GB 深空灰）
 *   - 包含价格、库存、规格属性、条码等
 *   - 一个 SPU 对应多个 SKU
 *
 * 数据库表：skus
 *
 * 注意：
 *   - 每个 SKU 必须有唯一 sku_code（如 IP15P-128-GRY）
 *   - attributes 用 Map 存储动态属性（颜色、内存、网络）
 *   - price 是最终售价，非成本价
 */
@Data
@Entity
@Table(name = "skus")
public class Sku {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "spu_id", nullable = false)
    private Long spuId; // 关联 SPU

    @Column(name = "sku_code", unique = true, nullable = false, length = 50)
    private String skuCode; // 唯一编码，如 IP15P-128-GRY

    @Column(name = "price", precision = 10, scale = 2, nullable = false)
    private BigDecimal price; // 销售价格

    @Column(name = "cost_price", precision = 10, scale = 2)
    private BigDecimal costPrice; // 成本价（内部使用）

    @Column(name = "stock", nullable = false)
    private Integer stock; // 总库存

    @Column(name = "weight", precision = 6, scale = 3)
    private Double weight; // 重量（kg）

    @Column(name = "volume", precision = 8, scale = 6)
    private Double volume; // 体积（m³）

    @Column(name = "barcode", length = 50)
    private String barcode; // 条形码

    @Column(name = "is_default")
    private Boolean isDefault = false; // 是否为默认 SKU（如默认颜色）

    @Column(name = "attributes", columnDefinition = "TEXT") // JSON 字符串存储
    private String attributes; // 动态属性，如 {"color":"深空灰","storage":"128GB"}

    @Column(name = "status")
    private ProductStatus status = ProductStatus.ON_SHELF; // SKU 状态（独立于 SPU）

    @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "GMT+8")
    private LocalDateTime createdAt;

    @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "GMT+8")
    private LocalDateTime updatedAt;

    // ========== 构造函数 ==========
    public Sku() {}

    public Sku(Long spuId, String skuCode, BigDecimal price, Integer stock, Map<String, String> attributes) {
        this.spuId = spuId;
        this.skuCode = skuCode;
        this.price = price;
        this.stock = stock;
        this.attributes = JsonUtils.toJson(attributes); // 工具类转换
        this.createdAt = LocalDateTime.now();
        this.updatedAt = LocalDateTime.now();
    }
}